Packages

Case studies

Load data

per lemma

Comparative analyses

read

filter

Check tweets

tweets %>%
  select(tweet, date) %>%
  # slice(., sample(1:n())) #random selection
  arrange(date)

Usage intensity

uses <- get_uses(tweets)
uses_tot <- get_uses_tot(uses)
age = get_age(uses)
coef_var <- get_coef_var(uses)
mean_date <- get_mean_date(uses)
max_date <- get_max_date(uses)
uses_month <- conv_uses_month(uses)
uses_plt <- plt_uses(uses_month, lemma, mean_date, max_date)
ggplotly(uses_plt)

Degree centralization

Diachronic

plt <- df_comp %>%
  filter(
    SUBSET != 'full',
    # LEMMA == 'solopreneur'
    LEMMA %in% c(
      # 'ghosting',
      # 'lituation',
      # 'alt-left',
      # 'solopreneur',
      # 'alt-right'
      'political correctness',
      'birther',
      'covfefe',
      'libtard'
      )
    ) %>%
  select(LEMMA, SUBSET, CENT_DEGREE) %>%
  mutate(SUBSET = factor(SUBSET, levels=c('one', 'two', 'three', 'four'))) %>%
  ggplot(., aes(x=SUBSET, y=CENT_DEGREE)) + # group=1
    geom_point(aes(group=LEMMA, color=LEMMA, shape=LEMMA)) +
    geom_line(aes(group=LEMMA, color=LEMMA, linetype=LEMMA)) +
    guides(group=FALSE) +
    ggtitle('Diffusion over time: changes in degree centralization') +
    scale_y_continuous('degree centrality (log)', trans='log') +
    scale_x_discrete('subset')

plt


# ggsave('out/cent_deg_diac_Anglo-Saxon.pdf', width=6, height=4)

Overall

df_comp %>%
  filter(
    LEMMA %in% cases,
    SUBSET == 'full'
    ) %>%
  select(
    LEMMA, 
    EDGES,
    CENT_DEGREE, 
    CENT_EV
    ) %>%
  arrange(desc(CENT_EV))

Comparative analyses

Degree centrality

Overall

List

df_comp %>%
  select(LEMMA, SUBSET, USES, CENT_DEGREE, CENT_EV) %>%
  filter(
    SUBSET == 'four',
    # USES >= 10000
    ) %>%
  arrange(
    (CENT_DEGREE)
    # desc(CENT_EV)
  )

Plot

plt <- df_comp %>%
  select(LEMMA, SUBSET, USES, CENT_DEGREE) %>%
  filter(SUBSET == 'full') %>%
  arrange((CENT_DEGREE)) %>%
  ggplot(., aes(x=CENT_DEGREE, y=reorder(LEMMA, CENT_DEGREE))) +
    geom_point() +
    scale_y_discrete('lemmas') +
    scale_x_continuous(
      'degree centralization (log)',
      trans='log'
      )

plt

# ggsave('out/cent_sync_all.pdf', width=6, height=4)

Over time

Across all lemmas

df_comp %>%
  filter(
    SUBSET %in% (c(
      'one', 
      'two',
      'three',
      'four'
      )),
    USES_TOT >= 10000
    ) %>%
  group_by(SUBSET) %>%
  summarize(CENT_AVG = mean(CENT_DEGREE)) %>%
  mutate(SUBSET = factor(SUBSET, levels=c(
    'one', 
    'two',
    'three',
    'four'
    ))) %>%
  ggplot(., aes(x=SUBSET, y=CENT_AVG, group=1)) +
    geom_line() +
    geom_point()

Biggest changes

df_comp %>%
  select(LEMMA, SUBSET, CENT_DEGREE, EDGES, USES_TOT) %>%
  filter(
    SUBSET %in% c(
      'one', 
      'four'
      ),
    USES_TOT >= 10000
    ) %>%
  dplyr::group_by(LEMMA) %>%
  dplyr::mutate(CENT_DIFF = CENT_DEGREE - lag(CENT_DEGREE)) %>%
  drop_na() %>%
  select(-SUBSET) %>%
  rename(
    CENT_LAST = CENT_DEGREE,
    EDGES_LAST = EDGES
    ) %>%
  arrange((CENT_DIFF))

Usage intensity

df_comp %>%
  filter(SUBSET == 'full') %>%
  arrange(desc(USES))

Usage intensity vs. network characteristics

Uses vs. degree centralization

Plot

plt <- df_comp %>%
  filter(
    SUBSET == 'four'
    # USES %in% (10000:2000000),
    # USES %in% (150000:500000),
    # !LEMMA %in% c('slut shaming', 'dashcam', 'shareable', 'cuckold', 'deep learning', 'hyperlocal')
    ) %>%
  select(LEMMA, CENT_DEGREE, USES, EDGES) %>%
  ggplot(., aes(x=CENT_DEGREE, y=USES)) +
    geom_text(aes(label=LEMMA), hjust=-0.1, vjust=-0.1) + 
    geom_point() +
    scale_y_continuous(
      'usage frequency (log)', 
      trans='log'
      ) +
    scale_x_continuous(
      'degree centralization',
      # trans='log'
      ) +
    ggtitle(
      # 'Usage frequency vs. degree centralization: full sample'
      'Usage frequency vs. degree centralization: zooming on case study lexemes'
      )
    # geom_smooth(method=lm)

ggplotly(plt)

# ggsave('~/Desktop/freq-vs-net.pdf', width=6, height=4)
    

Correlation

df_corr_full <- df_comp %>%
  filter(
    # SUBSET != 'full'
    # EDGES >= 100
    ) %>%
  select(-c(LEMMA, SUBSET, START, END, SKIP, STAMP, NROWS))
  
cor.test(df_corr_full$USES, df_corr_full$CENT_DEGREE)

    Pearson's product-moment correlation

data:  df_corr_full$USES and df_corr_full$CENT_DEGREE
t = -2.8574, df = 549, p-value = 0.004434
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.20253487 -0.03790525
sample estimates:
       cor 
-0.1210524 

Degree centrality vs. communities

Correlation

df_comp %>%
  filter(SUBSET == 'last') %>%
  select(CENT_DEGREE, COMMUNITIES) %>%
  mutate(COMMUNITIES = as.numeric(COMMUNITIES)) %>%
  correlate()

Plot

df_comp %>%
  filter(SUBSET == 'last') %>%
  select(LEMMA, CENT_DEGREE, COMMUNITIES) %>%
  ggplot(., aes(x=CENT_DEGREE, y=as.numeric(COMMUNITIES))) +
    geom_text(aes(label=LEMMA)) +
    scale_x_continuous(trans='log')

Uses vs. users

Plot

plt <- df_comp %>%
  filter(SUBSET == 'full') %>%
  select(LEMMA, USES, USERS) %>%
  ggplot(., aes(x=USERS, y=USES)) +
    geom_text(aes(label=LEMMA)) +
    scale_x_continuous(trans='log') +
    scale_y_continuous(trans='log') +
    geom_smooth(method=lm)
ggplotly(plt)

Correlation

df_comp %>%
  filter(SUBSET == 'full') %>%
  select(USES, USERS) %>%
  correlate()

Coefficient of variation

df_comp %>%
  filter(
    SUBSET == 'full',
    USES >= 1000
    ) %>%
  select(LEMMA, USES, COEF_VAR) %>%
  arrange(desc(COEF_VAR))

Processing status

Lemma list

df_comp %>%
  select(LEMMA, SUBSET, STAMP) %>%
  filter(SUBSET == 'last') %>%
  # mutate(STAMP = as_datetime(STAMP)) %>%
  arrange(desc(STAMP))

Dataset statistics

df_comp %>%
  filter(SUBSET == 'full') %>%
  select(LEMMA, SUBSET, USES, USERS) %>%
  dplyr::summarise(
    USES_TOT = sum(USES),
    USERS_TOT = sum(USERS)
    )

COEF_VAR vs. CENT

df_comp %>%
  filter(SUBSET == 'full') %>%
  select(LEMMA, COEF_VAR, CENT_DEGREE) %>%
  ggplot(., aes(y=COEF_VAR, x=CENT_DEGREE)) +
    geom_text(aes(label=LEMMA)) +
    scale_y_continuous(trans='log')

Correlations: EDA

library(Hmisc)

df_corr <- df_comp %>%
  # filter(SUBSET == 'last') %>%
  select(-c(LEMMA, SUBSET, NET_WINDOW_DATES, SKIP, STAMP, NROWS))
  # select(-c(USERS, AGE)) %>%
  # mutate(FOCUS = USES) %>%
  # focus(FOCUS) %>%
  # ggplot(., aes(reorder(rowname, FOCUS), FOCUS)) +
    # geom_col() +
    # coord_flip()
  # rearrange() %>%
  # shave() %>%
  # rplot()
  # network_plot(min_cor=.5) %>%

  
LS0tCmF1dGhvcjogJ1F1aXJpbiBXw7xyc2NoaW5nZXInCnRpdGxlOiAiU29jaWFsIG5ldHdvcmtzIG9mIGxleGljYWwgaW5ub3ZhdGlvbiIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIHRvYzogeWVzCi0tLQoKIyBQYWNrYWdlcwoKYGBge3IgaW5jbHVkZT1GQUxTRX0Kc291cmNlKCdzcmMvbG9hZC1kYXRhLlInKQpzb3VyY2UoJ3NyYy9wb3N0cHJvYy5SJykKc291cmNlKCdzcmMvdXNlcy5SJykKc291cmNlKCdzcmMvdXNlcnMuUicpCnNvdXJjZSgnc3JjL3NuYS5SJykKCmxpYnJhcnkoY29ycnIpCmxpYnJhcnkodGlkeXIpCmBgYAoKIyBDYXNlIHN0dWRpZXMKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CmNhc2VzIDwtIGMoJ2dob3N0aW5nJywgJ2xpdHVhdGlvbicsICdhbHQtbGVmdCcsICdzb2xvcHJlbmV1cicpCmBgYAoKIyMgTG9hZCBkYXRhCgojIyMgcGVyIGxlbW1hCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQpjb3JwdXMgPC0gJy9Wb2x1bWVzL3FqZC90d2ludC8nCmxlbW1hIDwtICdBbmdsby1TYXhvbicKCnR3ZWV0cyA8LSBsb2FkX2RhdGEoY29ycHVzLCBsZW1tYSkKdHdlZXRzIDwtIHBvc3Rwcm9jKHR3ZWV0cykKYGBgCgojIyMgQ29tcGFyYXRpdmUgYW5hbHlzZXMKCiMjIyMgcmVhZAoKYGBge3IgaW5jbHVkZT1GQUxTRX0KaWYgKGV4aXN0cygnZGZfY29tcCcpID09IEZBTFNFKSB7CiAgZGZfY29tcCA8LSByZWFkX2RmX2NvbXAoKQp9CmBgYAoKCiMjIyMgZmlsdGVyCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQpkZl9jb21wICU+JSAKICBmaWx0ZXIoU0tJUCAhPSBUUlVFKQpgYGAKCgojIyBDaGVjayB0d2VldHMKCmBgYHtyfQp0d2VldHMgJT4lCiAgc2VsZWN0KHR3ZWV0LCBkYXRlKSAlPiUKICAjIHNsaWNlKC4sIHNhbXBsZSgxOm4oKSkpICNyYW5kb20gc2VsZWN0aW9uCiAgYXJyYW5nZShkYXRlKQpgYGAKCgojIyBVc2FnZSBpbnRlbnNpdHkKCmBgYHtyfQp1c2VzIDwtIGdldF91c2VzKHR3ZWV0cykKdXNlc190b3QgPC0gZ2V0X3VzZXNfdG90KHVzZXMpCmFnZSA9IGdldF9hZ2UodXNlcykKY29lZl92YXIgPC0gZ2V0X2NvZWZfdmFyKHVzZXMpCm1lYW5fZGF0ZSA8LSBnZXRfbWVhbl9kYXRlKHVzZXMpCm1heF9kYXRlIDwtIGdldF9tYXhfZGF0ZSh1c2VzKQp1c2VzX21vbnRoIDwtIGNvbnZfdXNlc19tb250aCh1c2VzKQp1c2VzX3BsdCA8LSBwbHRfdXNlcyh1c2VzX21vbnRoLCBsZW1tYSwgbWVhbl9kYXRlLCBtYXhfZGF0ZSkKZ2dwbG90bHkodXNlc19wbHQpCmBgYAoKCiMjIERlZ3JlZSBjZW50cmFsaXphdGlvbgoKIyMjIERpYWNocm9uaWMKCmBgYHtyfQpwbHQgPC0gZGZfY29tcCAlPiUKICBmaWx0ZXIoCiAgICBTVUJTRVQgIT0gJ2Z1bGwnLAogICAgIyBMRU1NQSA9PSAnc29sb3ByZW5ldXInCiAgICBMRU1NQSAlaW4lIGMoCiAgICAgICMgJ2dob3N0aW5nJywKICAgICAgIyAnbGl0dWF0aW9uJywKICAgICAgIyAnYWx0LWxlZnQnLAogICAgICAjICdzb2xvcHJlbmV1cicsCiAgICAgICMgJ2FsdC1yaWdodCcKICAgICAgJ3BvbGl0aWNhbCBjb3JyZWN0bmVzcycsCiAgICAgICdiaXJ0aGVyJywKICAgICAgJ2NvdmZlZmUnLAogICAgICAnbGlidGFyZCcKICAgICAgKQogICAgKSAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgQ0VOVF9ERUdSRUUpICU+JQogIG11dGF0ZShTVUJTRVQgPSBmYWN0b3IoU1VCU0VULCBsZXZlbHM9Yygnb25lJywgJ3R3bycsICd0aHJlZScsICdmb3VyJykpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHg9U1VCU0VULCB5PUNFTlRfREVHUkVFKSkgKyAjIGdyb3VwPTEKICAgIGdlb21fcG9pbnQoYWVzKGdyb3VwPUxFTU1BLCBjb2xvcj1MRU1NQSwgc2hhcGU9TEVNTUEpKSArCiAgICBnZW9tX2xpbmUoYWVzKGdyb3VwPUxFTU1BLCBjb2xvcj1MRU1NQSwgbGluZXR5cGU9TEVNTUEpKSArCiAgICBndWlkZXMoZ3JvdXA9RkFMU0UpICsKICAgIGdndGl0bGUoJ0RpZmZ1c2lvbiBvdmVyIHRpbWU6IGNoYW5nZXMgaW4gZGVncmVlIGNlbnRyYWxpemF0aW9uJykgKwogICAgc2NhbGVfeV9jb250aW51b3VzKCdkZWdyZWUgY2VudHJhbGl0eSAobG9nKScsIHRyYW5zPSdsb2cnKSArCiAgICBzY2FsZV94X2Rpc2NyZXRlKCdzdWJzZXQnKQoKcGx0CgojIGdnc2F2ZSgnb3V0L2NlbnRfZGVnX2RpYWNfQW5nbG8tU2F4b24ucGRmJywgd2lkdGg9NiwgaGVpZ2h0PTQpCmBgYAoKCiMjIyBPdmVyYWxsCgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoCiAgICBMRU1NQSAlaW4lIGNhc2VzLAogICAgU1VCU0VUID09ICdmdWxsJwogICAgKSAlPiUKICBzZWxlY3QoCiAgICBMRU1NQSwgCiAgICBFREdFUywKICAgIENFTlRfREVHUkVFLCAKICAgIENFTlRfRVYKICAgICkgJT4lCiAgYXJyYW5nZShkZXNjKENFTlRfRVYpKQpgYGAKCgojIENvbXBhcmF0aXZlIGFuYWx5c2VzCgoKIyMgRGVncmVlIGNlbnRyYWxpdHkKCgojIyMgT3ZlcmFsbAoKIyMjIyBMaXN0CgpgYGB7cn0KZGZfY29tcCAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgVVNFUywgQ0VOVF9ERUdSRUUsIENFTlRfRVYpICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCA9PSAnZm91cicsCiAgICAjIFVTRVMgPj0gMTAwMDAKICAgICkgJT4lCiAgYXJyYW5nZSgKICAgIChDRU5UX0RFR1JFRSkKICAgICMgZGVzYyhDRU5UX0VWKQogICkKYGBgCgoKIyMjIyBQbG90CgpgYGB7cn0KcGx0IDwtIGRmX2NvbXAgJT4lCiAgc2VsZWN0KExFTU1BLCBTVUJTRVQsIFVTRVMsIENFTlRfREVHUkVFKSAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdmdWxsJykgJT4lCiAgYXJyYW5nZSgoQ0VOVF9ERUdSRUUpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHg9Q0VOVF9ERUdSRUUsIHk9cmVvcmRlcihMRU1NQSwgQ0VOVF9ERUdSRUUpKSkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIHNjYWxlX3lfZGlzY3JldGUoJ2xlbW1hcycpICsKICAgIHNjYWxlX3hfY29udGludW91cygKICAgICAgJ2RlZ3JlZSBjZW50cmFsaXphdGlvbiAobG9nKScsCiAgICAgIHRyYW5zPSdsb2cnCiAgICAgICkKCnBsdAoKIyBnZ3NhdmUoJ291dC9jZW50X3N5bmNfYWxsLnBkZicsIHdpZHRoPTYsIGhlaWdodD00KQpgYGAKCgojIyMgT3ZlciB0aW1lCgojIyMjIEFjcm9zcyBhbGwgbGVtbWFzCgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoCiAgICBTVUJTRVQgJWluJSAoYygKICAgICAgJ29uZScsIAogICAgICAndHdvJywKICAgICAgJ3RocmVlJywKICAgICAgJ2ZvdXInCiAgICAgICkpLAogICAgVVNFU19UT1QgPj0gMTAwMDAKICAgICkgJT4lCiAgZ3JvdXBfYnkoU1VCU0VUKSAlPiUKICBzdW1tYXJpemUoQ0VOVF9BVkcgPSBtZWFuKENFTlRfREVHUkVFKSkgJT4lCiAgbXV0YXRlKFNVQlNFVCA9IGZhY3RvcihTVUJTRVQsIGxldmVscz1jKAogICAgJ29uZScsIAogICAgJ3R3bycsCiAgICAndGhyZWUnLAogICAgJ2ZvdXInCiAgICApKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyh4PVNVQlNFVCwgeT1DRU5UX0FWRywgZ3JvdXA9MSkpICsKICAgIGdlb21fbGluZSgpICsKICAgIGdlb21fcG9pbnQoKQpgYGAKCgojIyMjIEJpZ2dlc3QgY2hhbmdlcwoKYGBge3J9CmRmX2NvbXAgJT4lCiAgc2VsZWN0KExFTU1BLCBTVUJTRVQsIENFTlRfREVHUkVFLCBFREdFUywgVVNFU19UT1QpICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCAlaW4lIGMoCiAgICAgICdvbmUnLCAKICAgICAgJ2ZvdXInCiAgICAgICksCiAgICBVU0VTX1RPVCA+PSAxMDAwMAogICAgKSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoTEVNTUEpICU+JQogIGRwbHlyOjptdXRhdGUoQ0VOVF9ESUZGID0gQ0VOVF9ERUdSRUUgLSBsYWcoQ0VOVF9ERUdSRUUpKSAlPiUKICBkcm9wX25hKCkgJT4lCiAgc2VsZWN0KC1TVUJTRVQpICU+JQogIHJlbmFtZSgKICAgIENFTlRfTEFTVCA9IENFTlRfREVHUkVFLAogICAgRURHRVNfTEFTVCA9IEVER0VTCiAgICApICU+JQogIGFycmFuZ2UoKENFTlRfRElGRikpCmBgYAoKCiMgVXNhZ2UgaW50ZW5zaXR5CgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdmdWxsJykgJT4lCiAgYXJyYW5nZShkZXNjKFVTRVMpKQpgYGAKCgoKIyBVc2FnZSBpbnRlbnNpdHkgdnMuIG5ldHdvcmsgY2hhcmFjdGVyaXN0aWNzCgojIyBVc2VzIHZzLiBkZWdyZWUgY2VudHJhbGl6YXRpb24KCiMjIyBQbG90CgpgYGB7cn0KcGx0IDwtIGRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUID09ICdmb3VyJwogICAgIyBVU0VTICVpbiUgKDEwMDAwOjIwMDAwMDApLAogICAgIyBVU0VTICVpbiUgKDE1MDAwMDo1MDAwMDApLAogICAgIyAhTEVNTUEgJWluJSBjKCdzbHV0IHNoYW1pbmcnLCAnZGFzaGNhbScsICdzaGFyZWFibGUnLCAnY3Vja29sZCcsICdkZWVwIGxlYXJuaW5nJywgJ2h5cGVybG9jYWwnKQogICAgKSAlPiUKICBzZWxlY3QoTEVNTUEsIENFTlRfREVHUkVFLCBVU0VTLCBFREdFUykgJT4lCiAgZ2dwbG90KC4sIGFlcyh4PUNFTlRfREVHUkVFLCB5PVVTRVMpKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsPUxFTU1BKSwgaGp1c3Q9LTAuMSwgdmp1c3Q9LTAuMSkgKyAKICAgIGdlb21fcG9pbnQoKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICAgICd1c2FnZSBmcmVxdWVuY3kgKGxvZyknLCAKICAgICAgdHJhbnM9J2xvZycKICAgICAgKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXMoCiAgICAgICdkZWdyZWUgY2VudHJhbGl6YXRpb24nLAogICAgICAjIHRyYW5zPSdsb2cnCiAgICAgICkgKwogICAgZ2d0aXRsZSgKICAgICAgIyAnVXNhZ2UgZnJlcXVlbmN5IHZzLiBkZWdyZWUgY2VudHJhbGl6YXRpb246IGZ1bGwgc2FtcGxlJwogICAgICAnVXNhZ2UgZnJlcXVlbmN5IHZzLiBkZWdyZWUgY2VudHJhbGl6YXRpb246IHpvb21pbmcgb24gY2FzZSBzdHVkeSBsZXhlbWVzJwogICAgICApCiAgICAjIGdlb21fc21vb3RoKG1ldGhvZD1sbSkKCmdncGxvdGx5KHBsdCkKIyBnZ3NhdmUoJ34vRGVza3RvcC9mcmVxLXZzLW5ldC5wZGYnLCB3aWR0aD02LCBoZWlnaHQ9NCkKICAgIApgYGAKCiMjIyBDb3JyZWxhdGlvbgoKYGBge3J9CmRmX2NvcnJfZnVsbCA8LSBkZl9jb21wICU+JQogIGZpbHRlcigKICAgICMgU1VCU0VUICE9ICdmdWxsJwogICAgIyBFREdFUyA+PSAxMDAKICAgICkgJT4lCiAgc2VsZWN0KC1jKExFTU1BLCBTVUJTRVQsIFNUQVJULCBFTkQsIFNLSVAsIFNUQU1QLCBOUk9XUykpCiAgCmNvci50ZXN0KGRmX2NvcnJfZnVsbCRVU0VTLCBkZl9jb3JyX2Z1bGwkQ0VOVF9ERUdSRUUpCmBgYAoKCiMjIERlZ3JlZSBjZW50cmFsaXR5IHZzLiBjb21tdW5pdGllcwoKIyMjIENvcnJlbGF0aW9uCgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdsYXN0JykgJT4lCiAgc2VsZWN0KENFTlRfREVHUkVFLCBDT01NVU5JVElFUykgJT4lCiAgbXV0YXRlKENPTU1VTklUSUVTID0gYXMubnVtZXJpYyhDT01NVU5JVElFUykpICU+JQogIGNvcnJlbGF0ZSgpCmBgYAoKCiMjIyBQbG90CgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdsYXN0JykgJT4lCiAgc2VsZWN0KExFTU1BLCBDRU5UX0RFR1JFRSwgQ09NTVVOSVRJRVMpICU+JQogIGdncGxvdCguLCBhZXMoeD1DRU5UX0RFR1JFRSwgeT1hcy5udW1lcmljKENPTU1VTklUSUVTKSkpICsKICAgIGdlb21fdGV4dChhZXMobGFiZWw9TEVNTUEpKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnM9J2xvZycpCmBgYAoKCgojIyBVc2VzIHZzLiB1c2VycwoKIyMjIFBsb3QKCmBgYHtyfQpwbHQgPC0gZGZfY29tcCAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdmdWxsJykgJT4lCiAgc2VsZWN0KExFTU1BLCBVU0VTLCBVU0VSUykgJT4lCiAgZ2dwbG90KC4sIGFlcyh4PVVTRVJTLCB5PVVTRVMpKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsPUxFTU1BKSkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zPSdsb2cnKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnM9J2xvZycpICsKICAgIGdlb21fc21vb3RoKG1ldGhvZD1sbSkKZ2dwbG90bHkocGx0KQpgYGAKCiMjIyBDb3JyZWxhdGlvbgoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnZnVsbCcpICU+JQogIHNlbGVjdChVU0VTLCBVU0VSUykgJT4lCiAgY29ycmVsYXRlKCkKYGBgCgoKIyMgQ29lZmZpY2llbnQgb2YgdmFyaWF0aW9uCgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoCiAgICBTVUJTRVQgPT0gJ2Z1bGwnLAogICAgVVNFUyA+PSAxMDAwCiAgICApICU+JQogIHNlbGVjdChMRU1NQSwgVVNFUywgQ09FRl9WQVIpICU+JQogIGFycmFuZ2UoZGVzYyhDT0VGX1ZBUikpCmBgYAoKCiMjIFByb2Nlc3Npbmcgc3RhdHVzCgojIyMgTGVtbWEgbGlzdAoKYGBge3J9CmRmX2NvbXAgJT4lCiAgc2VsZWN0KExFTU1BLCBTVUJTRVQsIFNUQU1QKSAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdsYXN0JykgJT4lCiAgIyBtdXRhdGUoU1RBTVAgPSBhc19kYXRldGltZShTVEFNUCkpICU+JQogIGFycmFuZ2UoZGVzYyhTVEFNUCkpCmBgYAoKCiMjIyBEYXRhc2V0IHN0YXRpc3RpY3MKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2Z1bGwnKSAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgVVNFUywgVVNFUlMpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoCiAgICBVU0VTX1RPVCA9IHN1bShVU0VTKSwKICAgIFVTRVJTX1RPVCA9IHN1bShVU0VSUykKICAgICkKYGBgCgoKIyBDT0VGX1ZBUiB2cy4gQ0VOVAoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnZnVsbCcpICU+JQogIHNlbGVjdChMRU1NQSwgQ09FRl9WQVIsIENFTlRfREVHUkVFKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHk9Q09FRl9WQVIsIHg9Q0VOVF9ERUdSRUUpKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsPUxFTU1BKSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zPSdsb2cnKQpgYGAKCgojIENvcnJlbGF0aW9uczogRURBCgpgYGB7cn0KbGlicmFyeShIbWlzYykKCmRmX2NvcnIgPC0gZGZfY29tcCAlPiUKICAjIGZpbHRlcihTVUJTRVQgPT0gJ2xhc3QnKSAlPiUKICBzZWxlY3QoLWMoTEVNTUEsIFNVQlNFVCwgTkVUX1dJTkRPV19EQVRFUywgU0tJUCwgU1RBTVAsIE5ST1dTKSkKICAjIHNlbGVjdCgtYyhVU0VSUywgQUdFKSkgJT4lCiAgIyBtdXRhdGUoRk9DVVMgPSBVU0VTKSAlPiUKICAjIGZvY3VzKEZPQ1VTKSAlPiUKICAjIGdncGxvdCguLCBhZXMocmVvcmRlcihyb3duYW1lLCBGT0NVUyksIEZPQ1VTKSkgKwogICAgIyBnZW9tX2NvbCgpICsKICAgICMgY29vcmRfZmxpcCgpCiAgIyByZWFycmFuZ2UoKSAlPiUKICAjIHNoYXZlKCkgJT4lCiAgIyBycGxvdCgpCiAgIyBuZXR3b3JrX3Bsb3QobWluX2Nvcj0uNSkgJT4lCgogIApgYGAKCgogIA==